# -*- conding:UTF-8 -*-

'''
@ Project: p6_421
@ File: utils.py
@ Author: 罗婷
@ Date：2022/4/26 11:39

'''
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.hashers import check_password
from django.db.models import Q
from rest_framework.utils import json
from ronglian_sms_sdk import SmsSDK

from p6_421 import settings
from users.models import User

# 返回指定格式的json数据 token
def jwt_response_payload_handler(*args, **kwargs):
    print('args:', args)
    print('kwargs:', kwargs)
    token, user, request = args
    return {
        'code': 200,
        'username': user.username,
        'user_id': user.id,
        'token': token
    }

# 只让管理员登录  自定义一个认证类 重写Authenticate方法   ModelBackend Django后端认证的一个类
class MyAuthentication(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 查询用户对象  可通过密码和手机号登录
        user = User.objects.filter(Q(username=username) | Q(phone=username)).first()
        # 判断用户,密码, 是否是管理员
        if user and check_password(password, user.password) and user.is_staff:
            return user    # 验证通过返回对象 否则返回None
        else:
            return None

# 借助容联运短信验证码
def send_message(sms_code, mobile, expire=5):   #  expire=5 5分钟过期
    # 实例化sdk
    sdk = SmsSDK(settings.ACCID, settings.ACCTOKEN, settings.APPID)

    # 组织数据
    tid = '1'                 #容联云通讯创建的模板ID
    mobile = "%s" % mobile
    datas = ("%s" % sms_code, "%s" % expire)  # 第一个:短信验证码  第二个: 多久过期

    # 发送短信 并接收响应
    res = sdk.sendMessage(tid=tid, mobile=mobile, datas=datas)

    # 解析响应
    print('发送短信的响应',res, type(res))

    res_dict = json.loads(res)
    if res_dict.get('statusCode') == '000000':
        return True
    else:
        return False







